package com.example.qt.ptplatform.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.qt.ptplatform.entity.User;
import com.example.qt.ptplatform.entity.UserAssessment;
import com.example.qt.ptplatform.mapper.UserAssessmentMapper;
import com.example.qt.ptplatform.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.util.List;

@Service
public class AdminService {

    @Autowired
    private UserMapper userMapper;  // 用于更新用户状态
    @Autowired
    private UserAssessmentMapper userAssessmentMapper;  // 用于查询考核记录

    /**
     * 批量判定封号操作
     * 1. 检查所有用户的考核记录
     * 2. 如果用户连续3次考核不合格，判定该用户封号
     */
    @Transactional
    public String batchBanUsers() {
        // 获取所有用户
        List<User> users = userMapper.selectList(null);

        // 遍历每个用户进行封号判定
        for (User user : users) {
            // 获取该用户的最近3次考核记录
            List<UserAssessment> recentAssessments = userAssessmentMapper.getRecentAssessments(user.getUserId(), 3);

            // 判断是否连续3次不合格
            long failedCount = recentAssessments.stream()
                    .filter(assessment -> "不合格".equals(assessment.getAssessmentStatus()))
                    .count();

            if (failedCount >= 3) {
                // 判断用户是否已封号，封号有时效
                if (user.getBanStatus() == null || !user.getBanStatus() || user.getBanEndTime().isBefore(LocalDate.now())) {
                    // 进行封号操作，设置封号时效（例如：封号30天）
                    user.setBanStatus(true);  // 设置封号
                    user.setBanStartTime(LocalDate.now());
                    user.setBanEndTime(LocalDate.now().plusDays(30));  // 30天封号时效
                    userMapper.updateById(user);
                }
            }
        }

        return "所有符合封号条件的用户已被封号。";
    }

    /**
     * 自动解封操作：每次调用时检查封号到期的用户，自动解封。
     */
    @Transactional
    @Scheduled(cron = "0 0 0 * * ?")  // 每天午夜12点执行
    public void autoUnbanUsers() {
        // 获取所有被封号的用户
        List<User> bannedUsers = userMapper.selectList(
                new QueryWrapper<User>().eq("ban_status", true).lt("ban_end_time", LocalDate.now()));

        // 遍历检查封号有效期是否已过
        for (User user : bannedUsers) {
            // 解封操作
            user.setBanStatus(false);  // 设置为解封状态
            user.setBanStartTime(null);  // 清除封号开始时间
            user.setBanEndTime(null);    // 清除封号结束时间
            userMapper.updateById(user);
        }
    }
}
